在 C 层级,Ruby 对象由结构体表示,这些结构体通过指针层级将 数据与行为分离 通过基于指针的层次结构实现。其中, klass 指针将一个实例与其“关联类”(方法所在位置)连接起来,而 super 指针则将类与其祖先连接起来,构建出一种结构化映射,供 Ruby 虚拟机用于解析继承关系。
1. klass 指针与标志位
每个 Ruby 对象都包含一个头部,其中包含一个 klass 指针和一个标志位掩码 flags。这些标志位用于标识对象的内部状态,例如用 'V' 来标记自动创建的“虚拟类”,以处理单例方法的分配。
2. 解耦状态(图 24.1)
像 lucille 这样的实例会存储其独有的 实例变量,但它自身并不拥有任何方法。它的 klass 指针将虚拟机引导至 Guitar 类对象的方法表。
3. 继承链
当 lucille.play() 被调用时,Ruby 会沿着 klass 指针查找。如果在 Guitar中未找到该方法,则沿着 super 指针指向 Object,从而获得对 clone 或 dup的访问权限。
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>